module phidget21.loader; import derelict.util.loader; class PhidgetLoader : SharedLibLoader { this() { super("phidget21.dll,phidget21.so"); } override void loadSymbols() { static import phidcommon = phidget21.phidcommon; static import phiddict = phidget21.phiddict; static import phidlog = phidget21.phidlog; static import phidmanager = phidget21.phidmanager; loadSymbolsImport!phidcommon(); loadSymbolsImport!phiddict(); loadSymbolsImport!phidlog(); loadSymbolsImport!phidmanager(); static import phidifkit = phidget21.phidgets.phidifkit; loadSymbolsImport!phidifkit(); } private { void loadSymbolsImport(alias mod)() { import std.traits : isFunctionPointer; foreach(m; __traits(allMembers, mod)) { static if (__traits(compiles, typeof(__traits(getMember, mod, m)))) { alias Type = typeof(__traits(getMember, mod, m)); static if (isFunctionPointer!(typeof(__traits(getMember, mod, m)))) { mixin("mod." ~ m ~ " = cast(Type)loadSymbol(m);"); } } } } } } __gshared PhidgetLoader Phidget; shared static this() { Phidget = new PhidgetLoader; }